package com.atguigu.srb.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.srb.core.mapper.DictMapper;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.pojo.vo.DictExcelVO;
import com.atguigu.srb.core.service.DictService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
//import org.springframework.stereotype.Service;

//@Service  //容器对象传参
public class DictExcelVoListener extends AnalysisEventListener<DictExcelVO> {
    //自动装配属性所在的对象必须也在容器中
//    @Resource
    DictService dictService;
    //如果对象不在容器中，可以通过方法或者构造器接收参数
    public DictExcelVoListener(DictService dictService) {
        this.dictService = dictService;
    }

    private List<DictExcelVO> dictExcelVOS = new ArrayList<>();
    private int limit = 100;
    @Override
    public void invoke(DictExcelVO data, AnalysisContext context) {
        dictExcelVOS.add(data);
        /*
            问题：
                1、批量保存 需要的参数类型为Dict
                2、如果数据库中已存在 excel中的某个数据字典，不保存

         */
        if(dictExcelVOS.size()==limit){
            List<Dict> dicts = convertExcelVos2Dicts();
            //保存到数据库
            dictService.saveBatch(dicts);
            dictExcelVOS.clear();
        }
    }
    //抽取的转换excelvo集合为dict集合的工具方法
    private List<Dict> convertExcelVos2Dicts() {
        return dictExcelVOS.stream().map(dictExcelVO -> {//将dictExcelVO对象转为Dict对象
                    Dict dict = new Dict();
                    //将源对象 相同的属性名和数据类型的 属性值 拷贝给目标对象   两个类型必须有get/set方法
                    BeanUtils.copyProperties(dictExcelVO, dict);
                    return dict;
                }).filter(dict -> {//筛选dict对象，如果数据库已存在该对象过滤掉
                    //如果id已存在 不保存
                    return dictService.count(Wrappers.lambdaQuery(Dict.class)
                        .eq(Dict::getId , dict.getId()))==0; //如果id查询不到数据保留，如果查询到了排除
                }).collect(Collectors.toList());
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if(dictExcelVOS.size()>0){
            List<Dict> dicts = convertExcelVos2Dicts();
            //保存到数据库
            dictService.saveBatch(dicts);
            dictExcelVOS.clear();
        }
    }
}
